package bp.tools;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * 图片水印工具类
 * 用于给指定路径的图片添加文本水印
 */
public class ImageWatermarkUtil {

    /**
     * 获取支持中文的字体
     */
    private static Font getChineseFont(int fontSize) {
        // 优先尝试中文字体
        String[] fontNames = {
                "Microsoft YaHei",  // 微软雅黑
                "SimHei",           // 黑体
                "SimSun",           // 宋体
                "KaiTi",            // 楷体
                "FangSong"          // 仿宋
        };

        for (String fontName : fontNames) {
            Font font = new Font(fontName, Font.BOLD, fontSize);
            // 检查字体是否包含中文字符
            if (font.canDisplay('中')) {
                return font;
            }
        }

        // 如果都不行，使用SansSerif（系统默认字体）
        return new Font(Font.SANS_SERIF, Font.BOLD, fontSize);
    }

    /**
     * 给图片添加文本水印
     *
     * @param imagePath 原图片路径
     * @param outputPath 输出图片路径（如果为空，则覆盖原图）
     * @param watermarkText 水印文本
     * @param fontSize 字体大小
     * @param fontColor 字体颜色（如：Color.WHITE）
     * @param position 水印位置（如："center", "bottom-right", "bottom-left", "top-right", "top-left"）
     * @param alpha 透明度（0.0-1.0）
     * @return 是否成功
     */
    public static boolean addTextWatermark(String imagePath, String outputPath,
                                           String watermarkText, int fontSize,
                                           Color fontColor, String position,
                                           float alpha,String ext) {
        try {
            // 读取原图片
            BufferedImage image = ImageIO.read(new File(imagePath));

            // 创建Graphics2D对象
            Graphics2D g2d = image.createGraphics();

            // 设置抗锯齿
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

            // 设置透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

            // 设置字体（支持中文）
            Font font = getChineseFont(fontSize);
            g2d.setFont(font);
            g2d.setColor(fontColor);

            // 获取文字尺寸
            FontMetrics fm = g2d.getFontMetrics();
            int textWidth = fm.stringWidth(watermarkText);
            int textHeight = fm.getHeight();

            // 获取图片尺寸
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();

            // 计算水印位置
            int x, y;
            switch (position.toLowerCase()) {
                case "center":
                    x = (imageWidth - textWidth) / 2;
                    y = (imageHeight + textHeight) / 2;
                    break;
                case "top-left":
                    x = 10;
                    y = textHeight + 10;
                    break;
                case "top-right":
                    x = imageWidth - textWidth - 10;
                    y = textHeight + 10;
                    break;
                case "bottom-left":
                    x = 10;
                    y = imageHeight - 10;
                    break;
                case "bottom-right":
                default:
                    x = imageWidth - textWidth - 10;
                    y = imageHeight - 10;
                    break;
            }

            // 绘制文字（带描边效果，增强可读性）
            // 绘制描边
            g2d.setColor(Color.BLACK);
            g2d.setStroke(new BasicStroke(2));
            for (int i = -1; i <= 1; i++) {
                for (int j = -1; j <= 1; j++) {
                    if (i != 0 || j != 0) {
                        g2d.drawString(watermarkText, x + i, y + j);
                    }
                }
            }

            // 绘制主体文字
            g2d.setColor(fontColor);
            g2d.drawString(watermarkText, x, y);

            g2d.dispose();

            // 保存图片
            String savePath = outputPath != null && !outputPath.isEmpty() ? outputPath : imagePath;

            // 获取文件扩展名
            String format = getFileExtension(ext);

            ImageIO.write(image, format, new File(savePath));

            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 简化版：添加水印到右下角
     *
     * @param imagePath 原图片路径
     * @param outputPath 输出图片路径
     * @param watermarkText 水印文本
     */
    public static boolean addTextWatermark(String imagePath, String outputPath, String watermarkText,String ext) {
        return addTextWatermark(imagePath, outputPath, watermarkText, 24, Color.WHITE, "bottom-right", 0.8f,ext);
    }


    /**
     * 获取文件扩展名
     */
    private static String getFileExtension(String filename) {
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < filename.length() - 1) {
            String ext = filename.substring(lastDotIndex + 1).toLowerCase();
            // 只返回支持的格式
            if (ext.equals("png") || ext.equals("jpg") || ext.equals("jpeg") ||
                    ext.equals("gif") || ext.equals("bmp")) {
                return ext;
            }
        }
        return "png"; // 默认PNG格式
    }

    /**
     * 添加多个水印（在图片上重复添加，例如满屏水印）
     *
     * @param imagePath 原图片路径
     * @param outputPath 输出图片路径
     * @param watermarkText 水印文本
     * @param fontSize 字体大小
     * @param color 字体颜色
     * @param alpha 透明度
     * @param spacing 水印间距
     */
    public static boolean addMultipleWatermarks(String imagePath, String outputPath,
                                                String watermarkText, int fontSize,
                                                Color color, float alpha, int spacing) {
        try {
            BufferedImage image = ImageIO.read(new File(imagePath));
            Graphics2D g2d = image.createGraphics();

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

            Font font = new Font("Arial", Font.BOLD, fontSize);
            g2d.setFont(font);
            g2d.setColor(color);

            FontMetrics fm = g2d.getFontMetrics();
            int textWidth = fm.stringWidth(watermarkText);
            int textHeight = fm.getHeight();

            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();

            // 旋转45度
            int centerX = imageWidth / 2;
            int centerY = imageHeight / 2;

            for (int x = 0; x < imageWidth + textWidth; x += textWidth + spacing) {
                for (int y = 0; y < imageHeight + textHeight; y += textHeight + spacing) {
                    Graphics2D rotatedG2d = (Graphics2D) g2d.create();
                    rotatedG2d.translate(x, y);
                    rotatedG2d.rotate(Math.toRadians(45));
                    rotatedG2d.drawString(watermarkText, 0, 0);
                    rotatedG2d.dispose();
                }
            }

            g2d.dispose();

            String format = getFileExtension(outputPath != null ? outputPath : imagePath);
            ImageIO.write(image, format, new File(outputPath != null ? outputPath : imagePath));

            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
}

